package negocio;

import beans.DocCabeceraTo;
import beans.ProductoTo;
import beans.TablaTo;
import beans.UsuarioTo;

import dao.NumeroVisitaDAO;
import dao.ProductoDAO;
import dao.RegistrarVentasDAO;
import dao.TablaDAO;

import java.util.ArrayList;
import java.util.Iterator;

import utildb.Transaction;
import utildb.TransactionException;


public class VentasManager {
    public VentasManager() {
        super();
    }

    public double incrementarNumeroVisita() throws VentasManagerException {
        Transaction t = new Transaction();
        double numeroVisita = 0;
        try {
                NumeroVisitaDAO dao = new NumeroVisitaDAO(t);
                numeroVisita = dao.incrementarContador();
                if (numeroVisita == 0 ) {
                        throw new VentasManagerException("No se puede incrementar el contador...");
                }
        } catch (TransactionException e) {
                throw new VentasManagerException(e.getMessage());
        } finally {
                t.close();
        }
        return numeroVisita;
    }
    
    public ProductoTo getProducto( String cruProv, String codigo ) throws VentasManagerException, UsuarioManagerException {
            Transaction t = new Transaction();
            boolean okey = false;
            ProductoTo producto = null;
            try {
                    if ((codigo == null) || codigo.length() == 0 || codigo.length() > 8) {
                            throw new VentasManagerException("Código no valido");
                    }
                    ProductoDAO dao = new ProductoDAO(t);

                   // ArrayList all = dao.arrayProductos();
			ArrayList all = dao.buscarProductos(cruProv, codigo);
			int item = 0;
			for (Iterator it = all.iterator(); it.hasNext();) {
				okey = true;
				ProductoTo prod = (ProductoTo) it.next();
                                producto = prod;
			}

                        if (producto == null ) {
                            throw new VentasManagerException("Producto no registrado");
                    }
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return producto;
    }
    
    public DocCabeceraTo getDocCabecera( String cRuProv, int nNumeDocu ) throws VentasManagerException {
            Transaction t = new Transaction();
            boolean okey = false;
            RegistrarVentasDAO dao = new RegistrarVentasDAO(t);
            DocCabeceraTo oCabe = new DocCabeceraTo();
            try {
                if ((cRuProv == null) || cRuProv.length() == 0) {
                   throw new VentasManagerException("Ruc no valido");
                }
		oCabe = dao.getDocCabecera(cRuProv, nNumeDocu);
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return oCabe;
    }

    public ArrayList buscarProductos( String cruProv, 
                                      String codCate ) throws VentasManagerException, TransactionException, UsuarioManagerException {
            Transaction t = new Transaction();
            ArrayList all = null;
            try {
                   ProductoDAO dao = new ProductoDAO(t);
                   // ArrayList all = dao.arrayProductos();
        	   all = dao.buscarProductos(cruProv, codCate);
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return all;
    }

    public ArrayList ejecutarBuscarProductos( String crucProv,
                                              String cCodProd,
                                              String cCodCate,
                                              String cTxtBuscar,
                                              double nPreProd1,
                                              double nPreProd2 ) throws VentasManagerException, TransactionException, UsuarioManagerException {
            Transaction t = new Transaction();
            boolean okey = false;
            ArrayList all = null;
            try {
                   ProductoDAO dao = new ProductoDAO(t);
                   // ArrayList all = dao.arrayProductos();
        	   all = dao.ejecutarBuscarProductos( crucProv,
                                                      cCodProd,
                                                      cCodCate,
                                                      cTxtBuscar,
                                                      nPreProd1,
                                                      nPreProd2 );
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return all;
    }

    public ArrayList arrayTablas( String cgrupo, Integer nTodos)
                                  throws VentasManagerException {
            Transaction t = new Transaction();
            ArrayList all = null;
            try {
                TablaDAO dao;
                dao = new TablaDAO(t);
                all = dao.arrayTablas( cgrupo );
                if (nTodos != null && nTodos.equals(1)) {
                    all.add(new TablaTo( "%", "Todos", "Todos", "%", 1));
                }
                if (all == null ) {
                        throw new VentasManagerException("Tabla no registrado");
                }
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return all;
    }
    
    public void grabarNewVenta(DocCabeceraTo oCabe,
                               ArrayList oDeta )
                               throws VentasManagerException, UsuarioManagerException {
		Transaction t = new Transaction();
		try {
			if(oCabe == null)
			    throw new VentasManagerException("No hay datos");
			else {
			    // Actualizar el ruc del Cliente (Usuario)
                            String cRuc_Clie;
                            String cCod_Usua;
                            cCod_Usua = oCabe.getcCod_Usua();
                            UsuarioManager pmg = new UsuarioManager();
                            UsuarioTo oUsuario = pmg.buscarUsuario( cCod_Usua );
                            cRuc_Clie = oUsuario.getCruc_Usua();
                            //
                            oCabe.setcRuc_Clie(cRuc_Clie);
                            //
                            RegistrarVentasDAO fact = new RegistrarVentasDAO(t);
                	    fact.grabarNewVenta(oCabe, oDeta);
        		    t.commit();
			}
		} catch (TransactionException e) {
			t.rollback();
			throw new VentasManagerException(e.getMessage());
		} finally {
			t.close();
		}
    }

    public ArrayList getBuscarDocumentos( String cRuProv ) throws VentasManagerException {
            Transaction t = new Transaction();
            RegistrarVentasDAO dao = new RegistrarVentasDAO(t);
            ArrayList listaDocumentos = new ArrayList();
            try {
                if ((cRuProv == null) || cRuProv.length() == 0) {
                   throw new VentasManagerException("Ruc no valido");
                }
		listaDocumentos = dao.getBuscarDocumentos(cRuProv);
            } catch (TransactionException e) {
                    throw new VentasManagerException(e.getMessage());
            } finally {
                    t.close();
            }
            return listaDocumentos;
    }

}
